package com.alex.server.service.impl;

import com.alex.server.pojo.Admin;
import com.alex.server.pojo.Menu;
import com.alex.server.service.IMenuService;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.alex.server.mapper.MenuMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;

import java.util.List;

import static com.baomidou.mybatisplus.core.toolkit.IdWorker.getId;

/**
 * <p>
 * 菜单表 服务实现类
 * </p>
 *
 * @author alex
 * @since 2022-08-30
 */
@Service
public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements IMenuService {
   @Autowired
   private  MenuMapper menuMapper;
   @Autowired
   private RedisTemplate redisTemplate;
    /**
     * 根据用户id获取菜单列表
     * @return
     */
    @Override
    public List<Menu> getMenusByAdmin() {
        //从授权的全文上下拿登录用户的id
        /**
         * 首先获取安全的上下文,获取身份验证,从验证个体中拿到用户id
         * 如果菜单数据发生改变,需要先把redis中的数据清空,然后在运行,否则查询到的数据一直是原菜单的数据
         */
        Integer AdminId = ((Admin) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getId();
        ValueOperations ops = redisTemplate.opsForValue();
        //从redis中获取菜单
        List<Menu> menus = (List<Menu>) ops.get("menu_" + AdminId);
        //判断menus是否为空
        if (CollectionUtils.isEmpty(menus)){
            //如果为空,代表缓存中不存在数据,只能去数据库获取
            menus= menuMapper.getMenusByAdminId(AdminId);
            //获取完之后,并把它存在缓存中,下一次获取时减少时间
            ops.set("menu_"+AdminId,menus);
        }
        //返回菜单
        return menus;
    }
    /**
     * 根据角色获取菜单列表
     */
    @Override
    public List<Menu> getMenusWithRole() {
        return menuMapper.getMenusWithRole() ;
    }
    /**
     * 查询所有菜单
     * @return
     */
    @Override
    public List<Menu> getAllMenus() {
        return menuMapper.getAllMenus();
    }


}
